import pandas as pd
import matplotlib.pyplot as plt
import os
from datetime import datetime
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 可配置的列名
DATE_COLUMN = '创建时间'
CEMENT_COLUMN = '净重'
PRODUCT_COLUMN = '货品'  # 产品类型列名
PRODUCT_VALUE = '水泥'      # 需要统计的产品值


def main():
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 文件路径
    base_dir = os.path.dirname(os.path.abspath(__file__))
    excel_path = os.path.join(base_dir, 'FhjlViewDD.xlsx')
    output_image = os.path.join(base_dir, 'june_cement_daily_total.png')

    try:
        # 加载Excel数据
        logger.info(f'正在读取Excel文件: {excel_path}')
        df = pd.read_excel(excel_path, engine='openpyxl')
        logger.info(f'成功加载数据，共 {len(df)} 行记录')

        # 检查必要列是否存在
        required_columns = [DATE_COLUMN, CEMENT_COLUMN, PRODUCT_COLUMN]
        missing_columns = [col for col in required_columns if col not in df.columns]
        if missing_columns:
            available_columns = ', '.join(df.columns)
            raise ValueError(f"Excel文件缺少必要列: {missing_columns}。可用列有: {available_columns}。请检查或修改程序中的列名变量。")

        # 筛选水泥产品数据
        df_cement = df[df[PRODUCT_COLUMN] == PRODUCT_VALUE]
        if len(df_cement) == 0:
            raise ValueError(f'未找到产品类型为 "{PRODUCT_VALUE}" 的数据记录,请检查Excel文件中的 {PRODUCT_COLUMN} 列。')
        logger.info(f'筛选出水泥产品数据 {len(df_cement)} 行')

        # 转换日期列，并处理无效日期
        df_cement[DATE_COLUMN] = pd.to_datetime(df_cement[DATE_COLUMN], errors='coerce')
        df_cement = df_cement.dropna(subset=[DATE_COLUMN])

        # 筛选6月份数据（当前年份）
        current_year = datetime.now().year
        df_june = df_cement[(df_cement[DATE_COLUMN].dt.year == current_year) & (df_cement[DATE_COLUMN].dt.month == 6)]

        if len(df_june) == 0:
            logger.warning(f'未找到 {current_year} 年6月份的水泥数据记录。')
            # 尝试查找所有年份的6月份数据
            df_june_all_years = df_cement[df_cement[DATE_COLUMN].dt.month == 6]
            if len(df_june_all_years) == 0:
                raise ValueError('未找到任何年份的6月份水泥数据记录。请检查Excel文件中的日期列。')
            else:
                logger.info(f'找到其他年份的6月份水泥数据 {len(df_june_all_years)} 行，将使用这些数据进行统计。')
                df_june = df_june_all_years
                current_year = '所有年份'

        logger.info(f'筛选出用于统计的6月份水泥数据 {len(df_june)} 行')

        # 按日期汇总水泥总量
        df_june['日期'] = df_june[DATE_COLUMN].dt.date
        daily_summary = df_june.groupby('日期')[CEMENT_COLUMN].sum().reset_index()
        daily_summary = daily_summary.sort_values('日期')

        if daily_summary.empty:
            raise ValueError('按日期汇总后没有水泥数据，无法生成图表。请检查数据筛选条件和列名。')

        # 绘制柱状图
        plt.figure(figsize=(12, 6))
        bars = plt.bar(daily_summary['日期'].astype(str), daily_summary[CEMENT_COLUMN], width=0.6, color='skyblue')
        plt.title(f'{current_year}年6月份每日水泥总量统计')
        plt.xlabel('日期')
        plt.ylabel(f'水泥总量 (单位: {CEMENT_COLUMN})')
        plt.xticks(rotation=45, ha='right')

        # 添加数据标签
        for bar in bars:
            height = bar.get_height()
            plt.text(bar.get_x() + bar.get_width()/2., height, f'{height}', ha='center', va='bottom')

        plt.tight_layout()

        # 保存图表
        plt.savefig(output_image, dpi=300)
        logger.info(f'图表已保存至: {output_image}')
        plt.close()

        logger.info('水泥数据统计完成！')

    except FileNotFoundError:
        logger.error(f'错误：Excel文件不存在，请确保文件位于: {excel_path}')
    except PermissionError:
        logger.error(f'错误：没有权限访问文件 {excel_path}。请确保文件未被其他程序占用，或检查文件权限。')
    except ValueError as ve:
        logger.error(f'数据处理错误: {ve}')
    except Exception as e:
        logger.error(f'发生未知错误: {e}')

if __name__ == '__main__':
    main()